昨天的範例程式裡,我們得多做一些事情才能正確地關閉資料串流,像是在 try-catch 區塊外先宣告物件變數,然後在 final 區塊裡得先檢查物件變數是不是 null 等。Java SE 7 裡提供了一個簡便的新陳述式,來簡化這些事。
新的陳述式就叫做 try-with-resource 。簡單的說,就是把宣告資料串流物件這樣的程式碼,直接在在 try 的陳述式裡。我們直接看範例比較快:
package idv.jacky.ironman4.day21;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Day21Example1 {
public static void main (String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("c:\\temp.txt"))) {
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}
}
你可以看到程式碼第10行,原本 try 陳述式就只有一個 try 加上左大括號,現在變得跟方法一樣,多個小括號,然後把需要關閉的資料串流物件變數宣裡裡面,然後在 try 區塊裡,我們一樣能自由地使用 br 物件,也不用多個 final 區塊來關閉它,當程式離開 try-catch 區塊時,會自動把宣告在 try-with-resource 陳述式裡的資料串流物件給關閉!
Java 只是幫你呼叫 close 方法,雖然你沒看到也沒寫,但 close 方法會丟出的 IOException 一樣得處理。不過我們已經有 catch 了,close 和 readLine 方法都是在 catch 之前呼叫的,所以會一起被 catch 下來。如果你省略了 catch, 那就得在方法宣告上多宣告會丟出 IOException 喔!
package idv.jacky.ironman4.day21;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Day21Example2 {
public static void main (String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("c:\\temp.txt"))) {
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
}
}
}